package com.myk.game.gobangchess.utils;

import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 自己定制的简单的配置工具
 */
public class ConfigUtils {
    public static void load(Class<?> configClazz,String filePath){
        try {
            //配置类的可见的静态属性名作为键名
            Field[] cfgFields = configClazz.getFields();
            if (!FileUtils.isFileExists(filePath)) {
                //若本地无配置文件就新建一个
                FileUtils.createOrExistsFile(filePath);
                //首行放一排###号，用于对抗BOM问题
                FileUtils.writeFileFromString(filePath, "############################################################");
            }
            List<String> cfgLines = FileUtils.readFile2List(filePath, "UTF-8"); //按行读取文本
            boolean isNewLineEnd = cfgLines.size() == 0 || StringUtils.isSpace(cfgLines.get(cfgLines.size() - 1)); //处于第一行或者末尾有换行
            cfgLines.removeIf(StringUtils::isSpace); //移除空行减少不必要的判断
            Map<String, String> cfgMap = new HashMap<>();
            for (String line : cfgLines) {
                //支持解析的格式(1): key=value ;（2） key=value//xxx ;  (3): key=value//xxx//xxx ; (4): //key=value//xxx
                String[] lineArr = line.split("//", 2);
                String data = lineArr[0].trim();
                if (StringUtils.isSpace(data)) continue;
                String[] dataArr = data.split("=", 2);
                if (dataArr.length != 2) continue;
                String key = dataArr[0].trim();
                String value = dataArr[1].trim();
                cfgMap.put(key, value);
            }
            for (Field cfgField : cfgFields) {
                String fieldName = cfgField.getName();
                if (cfgMap.containsKey(fieldName)) {
                    //若配置文件中有该键，给对应属性赋值。
                    String value = cfgMap.get(fieldName);
                    try {
                        cfgField.set(null, value);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                } else {
                    //若配置文件中无该键，追加该条配置，默认值为程序里初始化的
                    String defaultValue = "";
                    try {
                        defaultValue = (String) cfgField.get(null);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    String primaryData = (isNewLineEnd ? "" : System.lineSeparator()) + fieldName + "=" + defaultValue; //为了保证新加文本总是在下一行且上一行不会是空白
                    FileUtils.writeFileFromString(filePath, new String(primaryData.getBytes(StandardCharsets.UTF_8)), true);
                    isNewLineEnd = false; //因为上一句是不换行的，所以把isNewLineEnd变为false，以免下一次添加不换行
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
